﻿using CsvHelper.Configuration;
using CsvHelper;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Dynamic;
using System.Text.RegularExpressions;

namespace DM_TOOLS.Tools.DBC.DBCCSV
{
    public static class DBCCSVWriter
    {

        /// <summary>
        /// 将 CAN 数据文件名从原始格式（例如：can_20250924_181043_1.csv.gz）
        /// 转换为新格式（例如：2025_09_24-18_10_43-1-F.csv）。
        /// </summary>
        /// <param name="input">原始文件名字符串，例如 "can_20250924_181043_1.csv.gz"</param>
        /// <returns>转换后的文件名字符串，例如 "2025_09_24-18_10_43-1-F.csv"</returns>
        /// <remarks>
        /// 转换规则：
        /// <list type="number">
        /// <item><description>去掉前缀 "can_" 与后缀 ".csv.gz"</description></item>
        /// <item><description>提取日期（YYYYMMDD）与时间（HHMMSS）并格式化为 YYYY_MM_DD 与 HH_MM_SS</description></item>
        /// <item><description>在结尾追加序号和固定后缀 "-F.csv"</description></item>
        /// </list>
        /// 示例：can_20250924_181043_1.csv.gz → 2025_09_24-18_10_43-1-F.csv
        /// </remarks>
        public static async Task<string> ConvertCanFileNameToFAsync(this string input)
        {
            return await Task.Run(() =>
            {
                // 输入示例：can_20250924_181043_1.csv.gz
                // 去掉前缀 "can_" 和后缀 ".csv.gz"
                var core = input;
                if (core.StartsWith("can_")) core = core.Substring(4);
                if (core.EndsWith(".csv.gz")) core = core.Substring(0, core.Length - 7);

                // 拆分为日期、时间、序号
                var parts = core.Split('_');
                if (parts.Length < 3)
                    return input; // 如果格式不符合预期，直接返回原字符串

                var date = parts[0];  // 20250924
                var time = parts[1];  // 181043
                var index = parts[2]; // 1

                // 格式化日期和时间
                string dateFormatted = $"{date.Substring(0, 4)}_{date.Substring(4, 2)}_{date.Substring(6, 2)}";
                string timeFormatted = $"{time.Substring(0, 2)}_{time.Substring(2, 2)}_{time.Substring(4, 2)}";

                // 生成新文件名
                string newName = $"{dateFormatted}-{timeFormatted}-{index}-F.csv";
                return newName;
            });
        }


        /// <summary>
        /// 从文件名中提取设备号和通道号（如 can_0_1.dbc → (0, 1)）
        /// </summary>
        public static (uint Device, uint Channel) GetDeviceAndChannel(this string filePath)
        {
            string fileName = Path.GetFileNameWithoutExtension(filePath); // 去掉扩展名，得到 can_0_1

            // 使用正则表达式匹配设备号和通道号，前缀可以是任何字符串
            var match = Regex.Match(fileName, @"(\w+)_(\d+)_(\d+)");

            if (match.Success &&
                uint.TryParse(match.Groups[2].Value, out uint device) &&
                uint.TryParse(match.Groups[3].Value, out uint channel))
            {
                return (device, channel);
            }

            return (100, 100); // 不符合格式时返回默认值
        }
    }
}
